iT邦幫忙

0

day9 IOException 與子類別

  • 分享至 

  • xImage
  •  

在前面day6有稍微提到IOException,今天在做多一點的延伸學習
回顧一下
IO 是 Input / Output 的縮寫,意思是:
輸入(Input)與輸出(Output)資料的操作
在電腦或 Java 裡,只要是「從某個地方讀資料」或「寫資料到某個地方」,都叫 I/O 操作。

IOException 基本 I/O 例外 所有 I/O 相關錯誤都可能丟出它
FileNotFoundException 檔案不存在或無法打開 FileReader / FileInputStream
EOFException 遇到檔案結尾還繼續讀取 DataInputStream 讀檔案
InterruptedIOException I/O 被中斷 網路傳輸中或多執行緒被打斷
SocketException 網路 Socket 發生錯誤 Socket 連線錯誤
UnknownHostException 無法解析主機名稱 連線到不存在的 host
MalformedURLException URL 格式錯誤 使用 URL /
HttpURLConnection

public class Day9Demo {
public static PortStatus checkPort(String host, int port) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 2000);
socket.close();
return PortStatus.OPEN;
}catch(ConnectException e){
System.out.println("ConnectException: 目標 port 未開");
return PortStatus.CLOSED;
}catch (SocketTimeoutException e){
System.out.println("SocketTimeoutException: 連線超時");
return PortStatus.TIMEOUT;
}catch(UnknownHostException e){
System.out.println("UnknownHostException: 無法解析主機");
return PortStatus.CLOSED;
}catch (IOException e) {
System.out.println("IOException: 其他 I/O 錯誤");
return PortStatus.CLOSED;
}

}


public static void main(String[] args) {
    String host = "localhost";
    int[] ports = {22, 80, 8080, 9999};

    for (int port : ports) {
        PortStatus status = checkPort(host, port);
        System.out.println("port:" + port + "狀態" + status);
    }
}

}

今天這段程式碼的功能就是 掃描某台主機的指定 port 是否開放。
主機:host = "localhost"(也就是我的電腦自己)
要掃描的 port:22, 80, 8080, 9999
每個 port 的狀態:
OPEN → 這個 port 可以連線
CLOSED → port 未開
TIMEOUT → 連線超時,可能被防火牆擋住或網路不通
https://ithelp.ithome.com.tw/upload/images/20251006/20179429dhfwfhfMyt.png

main 先定義主機與 port 清單
用 for-each 迴圈遍歷每個 port
對每個 port 呼叫checkPort(host, port):
嘗試建立 socket 連線
根據連線結果回傳 PortStatus
印出每個 port 的狀態到 console

今天更詳細的學到IOException與子類別怎麼做使用
也學到超簡易Port Scanner(掃描目標電腦哪些服務在運行)
然後自動檢查指定主機的多個 port 是否開啟,並回報每個 port 的狀態,同時練習 Java 的網路程式與例外處理。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言